<!--
 *  Copyright (c) 2025 GraphQL Contributors
 *  All rights reserved.
 *
 *  This source code is licensed under the license found in the
 *  LICENSE file in the root directory of this source tree.
-->
<!doctype html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>GraphiQL 5 with React 19 and GraphiQL Explorer</title>
  <style>
    body {
      margin: 0;
    }

    #graphiql {
      height: 100dvh;
    }

    .loading {
      height: 100%;
      display: flex;
      align-items: center;
      justify-content: center;
      font-size: 4rem;
    }
  </style>
  <link rel="stylesheet" href="https://esm.sh/graphiql/dist/style.css" />
  <link rel="stylesheet" href="https://esm.sh/@graphiql/plugin-explorer/dist/style.css" />
  <link rel="stylesheet" href="https://unpkg.com/@highlightjs/cdn-assets@11.11.1/styles/default.min.css">
  <script src="https://unpkg.com/@highlightjs/cdn-assets@11.11.1/highlight.min.js"></script>
  <!--
     * Note:
     * The ?standalone flag bundles the module along with all of its `dependencies`, excluding `peerDependencies`, into a single JavaScript file.
     * `@emotion/is-prop-valid` is a shim to remove the console error ` module "@emotion /is-prop-valid" not found`. Upstream issue: https://github.com/motiondivision/motion/issues/3126
    -->
  <script type="importmap">
      {
        "imports": {
          "react": "https://esm.sh/react@19.1.0",
          "react/": "https://esm.sh/react@19.1.0/",

          "react-dom": "https://esm.sh/react-dom@19.1.0",
          "react-dom/": "https://esm.sh/react-dom@19.1.0/",

          "graphiql": "https://esm.sh/graphiql?standalone&external=react,react-dom,@graphiql/react,graphql",
          "graphiql/": "https://esm.sh/graphiql/",
          "@graphiql/plugin-explorer": "https://esm.sh/@graphiql/plugin-explorer?standalone&external=react,@graphiql/react,graphql",
          "@graphiql/react": "https://esm.sh/@graphiql/react?standalone&external=react,react-dom,graphql,@graphiql/toolkit,@emotion/is-prop-valid",

          "@graphiql/toolkit": "https://esm.sh/@graphiql/toolkit?standalone&external=graphql",
          "graphql": "https://esm.sh/graphql@16.11.0",
          "@emotion/is-prop-valid": "data:text/javascript,"
        }
      }
    </script>
  <script type="module">
    import React from 'react';
    import ReactDOM from 'react-dom/client';
    import { GraphiQL, HISTORY_PLUGIN } from 'graphiql';
    import { createGraphiQLFetcher } from '@graphiql/toolkit';
    import { explorerPlugin } from '@graphiql/plugin-explorer';
    import 'graphiql/setup-workers/esm.sh';

    const fetchDecorator = (fetchFunction) => {
      return function (url, options) {
        return fetchFunction(url, options)
          .then(response => {
            const sqlPreview = response.headers.get('X-SQL-Preview');
            if (sqlPreview) {
              const elem = document.querySelector('.graphiql-footer pre code');
              elem.innerHTML = hljs.highlightAuto(atob(sqlPreview)).value;

              const params = new URLSearchParams();
              params.set('query', encodeURIComponent(JSON.parse(options.body).query));
              window.history.replaceState({}, '', `${location.pathname}?${params}`);
            }
            return response;
          });
      };
    }

    const fetcher = createGraphiQLFetcher({
      // we reuse same index for grapqhl and graphql-relay
      url: new URL(window.location.pathname, window.location.origin),
      fetch: fetchDecorator(window.fetch),
    });
    const plugins = [HISTORY_PLUGIN, explorerPlugin()];

    const container = document.getElementById('graphiql');
    const root = ReactDOM.createRoot(container);
    root.render(
      React.createElement(GraphiQL, {
        fetcher,
        defaultEditorToolsVisibility: true,
        plugins,
        initialQuery: decodeURIComponent(new URLSearchParams(window.location.search).get('query') ?? ''),
      },
        // create a footer to show the SQL preview
        React.createElement(GraphiQL.Footer, null, React.createElement('pre', null, React.createElement('code', null, ''))),
      )
    );
  </script>
</head>

<body>
  <div id="graphiql">
    <div class="loading">Loading…</div>
  </div>
</body>

</html>